//
// Created by bobin on 18-7-7.
//
#include <string>
#include "ProtoUtil.h"
namespace ORB_SLAM2{
    ProtoUtil::ProtoUtil() {

    }

    void ProtoUtil::DoubleMatToMessage(const cv::Mat &mat, common::proto::MatrixXd *mat_pro) {
        cv::Mat mat_double;
        if (mat.type() != CV_64F) {
            mat.convertTo(mat_double, CV_64F);
        }
        int height = mat.rows;
        int width = mat.cols;
        mat_pro->set_rows(height);
        mat_pro->set_cols(width);
        for (int i = 0; i < height; ++i) {
            for (int j = 0; j < width; ++j) {
                int id = i * width + j;
                mat_pro->add_data(id);
                mat_pro->set_data(id, mat_double.at<double>(i, j));
            }
        }
    }

    void ProtoUtil::MessageToMat(const common::proto::MatrixXd &mat_pro, cv::Mat &mat) {
        int height = mat_pro.rows();
        int width = mat_pro.cols();
        mat.create(height, width, CV_64F);
        for (int i = 0; i < height; ++i) {
            for (int j = 0; j < width; ++j) {
                int id = i *width + j;
                mat.at<double>(i ,j) = mat_pro.data(id);
            }
        }
    }

    void ProtoUtil::UcharMatToMessage(const cv::Mat &mat, common::proto::MapPoint *mp_pro) {
        std::string str;
        assert(mat.rows == 1);
        str.resize(mat.cols);
        for (int i = 0; i < mat.cols; ++i) {
            str[i] = mat.at<unsigned char>(i);
        }
        mp_pro->set_orb_descriptor(str);
    }

    void ProtoUtil::MessageUcharMat(const common::proto::MapPoint &mp_pro, std::string &desc) {
//        std::string str;
//        str.resize(mat_pro.cols());
//        for (int i = 0; i < mat_pro.cols(); ++i) {
//            str[i] =
//        }

    }
}